<

デフォルトのドラッグスクロールデバイス

まとめ

ScrollBehavior指定した場所からのドラッグスクロールを許可または禁止できるようになりましたPointerDeviceKinds.ScrollBehavior.dragDevices、デフォルトでは、 スクロールウィジェットを全員がドラッグできるようにしますPointerDeviceKinds を除いてPointerDeviceKind.mouse

コンテクスト

この変更が行われる前は、すべてPointerDeviceKindをドラッグできますScrollableウィジェット。 これは、Flutter を操作する際の開発者の期待と一致しませんでした マウス入力デバイスを使用するアプリケーション。これも実行を困難にしました 他のマウス ジェスチャ (テキストに含まれるテキストの選択など)Scrollableウィジェット。

さて、受け継がれたのは、ScrollBehaviorどのデバイスがスクロール ウィジェットをドラッグできるかを管理します によって指定されるようにScrollBehavior.dragDevices。このセットは、PointerDeviceKindは ドラッグすることが許可されています。

変更内容の説明

この変更により、マウスのドラッグによる予期しないスクロール機能が修正されました。

アプリケーション内の以前の動作に依存している場合は、いくつかの方法があります。 この機能を制御および設定します。

  • 拡張するScrollBehaviorMaterialScrollBehavior、 またCupertinoScrollBehaviorデフォルトの動作を変更してオーバーライドするScrollBehavior.dragDevices

    • あなた自身のものでScrollBehavior、設定することでアプリ全体に適用できますMaterialApp.scrollBehaviorまたCupertinoApp.scrollBehavior
    • または、特定のウィジェットにのみ適用したい場合は、ScrollConfiguration問題のウィジェットの上にある カスタムScrollBehavior

スクロール可能なウィジェットはこの動作を継承し、反映します。

  • 自分で作成するのではなく、ScrollBehavior、別の変更オプション デフォルトの動作では、既存のScrollBehavior、異なる設定dragDevices
    • を作成しますScrollConfigurationウィジェット ツリーに追加し、変更したコピーを提供します 既存のScrollBehavior現在のコンテキストで使用するcopyWith

ドラッグデバイスの新しい構成に対応するにはScrollBehaviorGestureDetector.kindとともに廃止されました パラメータのすべてのサブクラス化されたインスタンス。 既存のコードを移行するために flutter修正が利用可能です すべてのジェスチャ検出器に対してkindsupportedDevices。 前のパラメータkind一つだけ許されるPointerDeviceKindに ジェスチャをフィルタリングするために使用されます。 の導入supportedDevicesより多くのことを可能にします 有効な 1 つよりもPointerDeviceKind

移行ガイド

カスタムの設定ScrollBehaviorあなたのアプリケーションのために

移行前のコード:

MaterialApp(
  // ...
);

移行後のコード:

class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // Override behavior methods and getters like dragDevices
  @override
  Set<PointerDeviceKind> get dragDevices => { 
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
    // etc.
  };
}

// Set ScrollBehavior for an entire application.
MaterialApp(
  scrollBehavior: MyCustomScrollBehavior(),
  // ...
);

カスタムの設定ScrollBehavior特定のウィジェットの場合

移行前のコード:

final ScrollController controller = ScrollController();
ListView.builder(
  controller: controller,
  itemBuilder: (BuildContext context, int index) {
   return Text('Item $index');
 }
);

移行後のコード:

class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // Override behavior methods and getters like dragDevices
  @override
  Set<PointerDeviceKind> get dragDevices => { 
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
    // etc.
  };
}

// ScrollBehavior can be set for a specific widget.
final ScrollController controller = ScrollController();
ScrollConfiguration(
  behavior: MyCustomScrollBehavior(),
  child: ListView.builder(
    controller: controller,
    itemBuilder: (BuildContext context, int index) {
     return Text('Item $index');
    }
  ),
);

既存のものをコピーして変更するScrollBehavior

移行前のコード:

final ScrollController controller = ScrollController();
ListView.builder(
  controller: controller,
  itemBuilder: (BuildContext context, int index) {
   return Text('Item $index');
 }
);

移行後のコード:

// ScrollBehavior can be copied and adjusted.
final ScrollController controller = ScrollController();
ScrollConfiguration(
  behavior: ScrollConfiguration.of(context).copyWith(dragDevices: {
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
  }),
  child: ListView.builder(
    controller: controller,
    itemBuilder: (BuildContext context, int index) {
     return Text('Item $index');
    }
  ),
);

移行するGestureDetectorからのkindsupportedDevices

移行前のコード:

VerticalDragGestureRecognizer(
  kind: PointerDeviceKind.touch,
);

移行後のコード:

VerticalDragGestureRecognizer(
  supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch },
);

タイムライン

リリースされたバージョン: 2.3.0-12.0.pre
安定版リリース: 2.5

参考文献

API ドキュメント:

  • ScrollConfiguration
  • ScrollBehavior
  • MaterialScrollBehavior
  • CupertinoScrollBehavior
  • PointerDeviceKind
  • GestureDetector

関連する問題:

  • 問題 #71322

関連する PR:

  • スクロール可能でデフォルトでマウスのドラッグを拒否する
  • 新しい SupportedDevices を優先して GestureDetector.kind を非推奨にします
1cc7b4d2-f900-4851-831e-a60aeff​​1ae35